Find largest value in each tree row¶
Time: O(N); Space: O(H); medium
You need to find the largest value in each row of a binary tree.
Example 1:
Input: root = {TreeNode} [1,3,2,5,3,None,9]
1
/ \
3 2
/ \ \
5 3 9
Output: [1,3,9]
Example 2:
1
/ \
2 3
/ \ /
4 5 6
\
7
Input: root = {TreeNode} [1,2,3,4,5,6,None,None,7]
Output: [1,3,6,7]
[1]:
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
1. Recursion¶
[2]:
class Solution1(object):
"""
Time: O(N)
Space: O(H)
"""
def largestValues(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
def largestValuesHelper(root, depth, result):
if not root:
return
if depth == len(result):
result.append(root.val)
else:
result[depth] = max(result[depth], root.val)
largestValuesHelper(root.left, depth + 1, result)
largestValuesHelper(root.right, depth + 1, result)
result = []
largestValuesHelper(root, 0, result)
return result
[3]:
s = Solution1()
root = TreeNode(1)
root.left, root.right = TreeNode(3), TreeNode(2)
root.left.left, root.left.right = TreeNode(5), TreeNode(3)
root.right.right = TreeNode(9)
assert s.largestValues(root) == [1,3,9]
root = TreeNode(1)
root.left, root.right = TreeNode(2), TreeNode(3)
root.left.left, root.left.right = TreeNode(4), TreeNode(5)
root.right.left = TreeNode(6)
root.left.left.right = TreeNode(7)
assert s.largestValues(root) == [1,3,6,7]
2. Iterative¶
[4]:
class Solution2(object):
def largestValues(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
result = []
curr = [root]
while any(curr):
result.append(max(node.val for node in curr))
curr = [child for node in curr for child in (node.left, node.right) if child]
return result
[5]:
s = Solution2()
root = TreeNode(1)
root.left, root.right = TreeNode(3), TreeNode(2)
root.left.left, root.left.right = TreeNode(5), TreeNode(3)
root.right.right = TreeNode(9)
assert s.largestValues(root) == [1,3,9]
root = TreeNode(1)
root.left, root.right = TreeNode(2), TreeNode(3)
root.left.left, root.left.right = TreeNode(4), TreeNode(5)
root.right.left = TreeNode(6)
root.left.left.right = TreeNode(7)
assert s.largestValues(root) == [1,3,6,7]